package StackOrQueue;//给你一个字符串 path ，表示指向某一文件或目录的 Unix 风格 绝对路径 （以 '/' 开头），请你将其转化为更加简洁的规范路径。
//
// 在 Unix 风格的文件系统中，一个点（.）表示当前目录本身；此外，两个点 （..） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成
//部分。任意多个连续的斜杠（即，'//'）都被视为单个斜杠 '/' 。 对于此问题，任何其他格式的点（例如，'...'）均被视为文件/目录名称。 
//
// 请注意，返回的 规范路径 必须遵循下述格式： 
//
// 
// 始终以斜杠 '/' 开头。 
// 两个目录名之间必须只有一个斜杠 '/' 。 
// 最后一个目录名（如果存在）不能 以 '/' 结尾。 
// 此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 '.' 或 '..'）。 
// 
//
// 返回简化后得到的 规范路径 。 
//
// 
//
// 示例 1： 
//
// 
//输入：path = "/home/"
//输出："/home"
//解释：注意，最后一个目录名后面没有斜杠。 
//
// 示例 2： 
//
// 
//输入：path = "/../"
//输出："/"
//解释：从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。
// 
//
// 示例 3： 
//
// 
//输入：path = "/home//foo/"
//输出："/home/foo"
//解释：在规范路径中，多个连续斜杠需要用一个斜杠替换。
// 
//
// 示例 4： 
//
// 
//输入：path = "/a/./b/../../c/"
//输出："/c"
// 
//
// 
//
// 提示： 
//
// 
// 1 <= path.length <= 3000 
// path 由英文字母，数字，'.'，'/' 或 '_' 组成。 
// path 是一个有效的 Unix 风格绝对路径。 
// 
// Related Topics 栈 字符串 👍 331 👎 0


import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Stack;

//leetcode submit region begin(Prohibit modification and deletion)
class simplifyPath {
    public static String simplifyPath(String path) {
        int len = path.length();
        //为1时，可能为 /或  .
        if(len==1){
            return "/";
        }

        /**
         按照'/'切分路径，可能切分出 空串和. 我们不需处理这个，
         切分出 ".." ，就弹出栈顶，如果栈顶为空，则不做动作
         其它格式，就是文件名称，放入栈中
         */
        String[] names = path.split("/");
        Deque<String> stack = new ArrayDeque<String>();
        for (String name : names) {
            //如果遇到".." ，就弹出栈顶，如果栈顶为空，则不做动作
            if ("..".equals(name)) {
                if (!stack.isEmpty()) {
                    stack.pollLast();
                }
                //如果是其它的字符，但不是"."，
            } else if (name.length() > 0 && !".".equals(name)) {
                stack.offerLast(name);
            }
        }

        StringBuffer ans = new StringBuffer();
        if (stack.isEmpty()) {
            ans.append('/');
        } else {
            while (!stack.isEmpty()) {
                ans.append('/');
                ans.append(stack.pollFirst());
            }
        }
        return ans.toString();
    }

    public static String simplifyPath1(String path) {
        //可以看出  当遇到文件名时 包括多于...以上的格式都入栈
        //遇到.则跳过，遇到..则出栈,多个/视为一个

        if(path==null || path.length()==0){
            return "/";
        }
        int len = path.length();
        Deque<String> stack = new ArrayDeque<>(); //栈
        int right = 0;
        int left = 0;
        //双指针截断
        while(right < len){
            //找到第一个不为'/'的位置
            while(right<len && path.charAt(right) == '/'){
                right++;
            }
            //left指向第一个文件夹名的下标
            left = right;
            //找到下一个 '/'的位置
            while(right<len && path.charAt(right) != '/'){
                right++;
            }
            //将当前路径放入
            String str = path.substring(left,right);

            //判断当前字符串如果为.. 则弹出
            if("..".equals(str)){
                if(!stack.isEmpty()){
                    stack.pollLast();

                }
                continue;
            }
            if(".".equals(str) || "".equals(str)){
                continue;
            }
            //其他情况
            stack.addLast(str);
        }
        if(stack.isEmpty()){
            return "/";
        }


        StringBuilder sb = new StringBuilder();
        while(!stack.isEmpty()){
            sb.append("/");
            sb.append(stack.pollFirst());
        }

        return sb.toString();

    }

    public static void main(String[] args) {
//        System.out.println(simplifyPath("/."));
        System.out.println(simplifyPath1("/home/"));
    }
}
//leetcode submit region end(Prohibit modification and deletion)
